#coding: utf8

from django.db import models
from django.forms.fields import CharField
from antimicrobiano.ddiscreto import SEXO
from antimicrobiano.ddiscreto import STATUS_SOLICITACAO
from antimicrobiano.ddiscreto import STATUS_ABERTO
from antimicrobiano.ddiscreto import SIM_NAO
from antimicrobiano.ddiscreto import NAO
from antimicrobiano.ddiscreto import DIASANOS
from django.contrib.auth.models import User
from django.contrib.auth.models import Group
from datetime import datetime

class Pessoa(models.Model):
    nome = models.CharField(max_length = 100)
    cpf = models.CharField(max_length = 11, unique=True)
    rg = models.CharField(max_length = 11)
    orgao_expedidor = models.CharField(max_length = 5)
    ug_orgao = models.CharField(max_length = 2)
    data_nascimento = models.DateField()
    email = models.CharField(max_length = 255, verbose_name='E-Mail')
    fone = models.CharField(max_length = 15)
    celular = models.CharField(max_length = 15)
    sexo = models.CharField(max_length = 1, choices = SEXO)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    observacao = models.TextField(blank=True)

    def __unicode__(self):
        return self.nome

    def idade_em_dias(self):
        
        hoje = datetime.today().date()
        
        dias_nascimento = (hoje - self.data_nascimento.date()).days
        
        return dias_nascimento
    
    
    def idade(self):
        
        dias_nascimento = self.idade_em_dias()
        
        idade = dias_nascimento / 364
        
        return idade
    

    def data_nascimento_str(self):
        return self.data_nascimento.strftime('%d/%m/%Y')
    
    def fase(self):
        idade = self.idade()
        idade_em_dias = self.idade_em_dias()
        
        fases = Fase.objects.all()
        retorno = 'desconhecido'
        for fase in fases:
            if (fase.inicio_diasmes == 'A' and fase.fim_diasmes == 'A'):
                if (idade >= fase.inicio and (idade<= fase.fim or fase.fim == None)):
                    retorno = fase.nome
            elif (fase.inicio_diasmes == 'D' and fase.fim_diasmes == 'A'):
                    if (idade_em_dias >= fase.inicio and idade <=fase.fim):
                        retorno = fase.nome
            elif (fase.inicio_diasmes == 'D' and fase.fim_diasmes == 'D'):
                    if (idade_em_dias >= fase.inicio and idade_em_dias <=fase.fim):
                        retorno = fase.nome
                    
                
            
        return retorno


class Paciente(Pessoa):
     pass

class Medico(Pessoa):
     crm = models.CharField(max_length = 100)
     grupo = models.ForeignKey(Group)
     user = models.ForeignKey(User, unique=True)
     
     def save(self, *args, **kwargs):
        
        self.user.is_staff = True
        self.user.save()
        super(Medico, self).save(*args, **kwargs)


class Clinica(models.Model):
    nome = models.CharField(max_length = 20)
    observacao = models.TextField(blank=True)


    def __unicode__(self):
        return self.nome

class Enfermaria(models.Model):
    clinica = models.ForeignKey(Clinica)
    nome = models.CharField(max_length = 20)
    observacao = models.TextField(blank=True)


    def __unicode__(self):
        return self.clinica.nome + "/" + self.nome

class Leito(models.Model):
    #Editable False faz com que o campo nao apareca no formulario de edicao
    enfermaria = models.ForeignKey(Enfermaria, editable=False)
    #enfermaria = models.ForeignKey(Enfermaria)
    nome = models.CharField(max_length = 20)
    observacao = models.TextField(blank=True)


    def __unicode__(self):
        return self.nome + " ("+ self.enfermaria.clinica.nome + "/" + self.enfermaria.nome + ")"


class Medicamento(models.Model):
    nome = models.CharField(max_length=50)
    indicacao = models.TextField()
    efeito_colateral = models.TextField()
    espectro = models.TextField()
    preparo_administrativo = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.nome

    def posologias(self):
        """
            Contar quantas posologias o medicamento possui
        """

        posologias = Posologia.objects.filter(medicamento=self)
        quant = posologias.count()

        return quant

class Antimicrobiano(Medicamento):
    pass

class Fase(models.Model):
    nome = models.CharField(max_length=30)
    inicio = models.IntegerField()
    inicio_diasmes = models.CharField(max_length=1, default='A', choices = DIASANOS, verbose_name='Início em')
    fim = models.IntegerField(null=True, blank=True)
    fim_diasmes = models.CharField(max_length=1, default='A', choices = DIASANOS, verbose_name='Fim em')
    
    def inicio_str(self):
        if self.inicio_diasmes == 'D':
            return str(self.inicio) + " dias"
        else:
            return self.inicio
        
    def fim_str(self):
        if self.fim_diasmes == 'D':
            return str(self.fim) + " dias"
        else:
            return self.fim
        
    def __unicode__(self):
        return self.nome

class TipoDose(models.Model):
    descricao = models.CharField(max_length=30)
    sigla = models.CharField(max_length=5)

    def __unicode__(self):
        return self.sigla

class Periodo(models.Model):
    nome = models.CharField(max_length=30)

    def __unicode__(self):
        return self.nome

class Unidade(models.Model):
    nome = models.CharField(max_length=30)
    sigla = models.CharField(max_length=5)

    def __unicode__(self):
        return self.sigla

class Posologia(models.Model):
    dose_inicial = models.FloatField()
    dose_final = models.FloatField()
    dose_maxima = models.FloatField()
    duracao_tratamento = models.IntegerField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    medicamento = models.ForeignKey(Medicamento)
    fase = models.ForeignKey(Fase)
    tipo_dose = models.ForeignKey(TipoDose)
    periodo = models.ForeignKey(Periodo)
    unidade = models.ForeignKey(Unidade, related_name='id_unidade')
    unidade_dose_maxima = models.ForeignKey(Unidade, related_name='id_unidade_dose_maxima')

class Prontuario(models.Model):
    identificador = models.CharField(max_length=15)
    dataEntrada = models.DateTimeField()
    dataSaida = models.DateTimeField()
    observacoes = models.TextField(blank=True)
    medico = models.ForeignKey(Medico)
    paciente = models.ForeignKey(Paciente)
    leito = models.ForeignKey(Leito)

    def __unicode__(self):
        return self.identificador


class Patologia(models.Model):
    nome = models.CharField(max_length=50)
    patogenos_comuns= models.CharField(max_length=50)

    def __unicode__(self):
        return self.nome

class Solicitacao(models.Model):
    medico = models.ForeignKey(Medico)
    prontuario = models.ForeignKey(Prontuario)
    antimicrobiano = models.ForeignKey(Antimicrobiano)
    patologia = models.ForeignKey(Patologia)
    situacao = models.CharField(max_length=1, default=STATUS_ABERTO, choices = STATUS_SOLICITACAO)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True,verbose_name="Atualizado em")
    periodo = models.ForeignKey(Periodo)
    dose = models.CharField(max_length=10)
    unidade  = models.ForeignKey(Unidade)
    tipo_dose= models.ForeignKey(TipoDose)
    funcao_renal = models.BooleanField(verbose_name="função renal ?")
    funcao_epatica_normal = models.BooleanField(verbose_name="função epatica normal ?")
    realizou_cultura = models.BooleanField(verbose_name="realizou cultura ?")
    resultado = models.CharField(blank=True, max_length=200)
    justificativa = models.TextField()
    justificativa_aprovacao = models.TextField()
    dispensado = models.CharField(max_length=1, default=NAO, choices = SIM_NAO)
    justificativa_dispensa = models.TextField(blank=True)
    possui_restricao = models.CharField(max_length=1, default=NAO, choices = SIM_NAO, verbose_name="Restrição?")
    restricao = models.TextField(verbose_name='Restrição')


    def __unicode__(self):
        return str(self.id) #+ " - " + self.created_at.strftime("%d/%M/%Y")

    def paciente(self):
        return self.prontuario.paciente.nome

    def leito(self):
        return self.prontuario.leito
    
    def restricao_str(self):
        if self.restricao:
            return self.restricao
        else:
            return "Sem restrição"

    class Meta:
        verbose_name_plural = "Solicitações"



class Tratamento(models.Model):

     patologia = models.ForeignKey(Patologia)
     observacao = models.TextField(blank=True)

     def __unicode__(self):
        return self.patologia.nome


class PosologiaAlternativa(models.Model):

    tratamento = models.ForeignKey(Tratamento)
    dose_inicial = models.FloatField()
    dose_final = models.FloatField()
    dose_maxima = models.FloatField()
    duracao_tratamento = models.IntegerField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    fase = models.ForeignKey(Fase)
    tipo_dose = models.ForeignKey(TipoDose)
    periodo = models.ForeignKey(Periodo)
    unidade = models.ForeignKey(Unidade, related_name='id_unidade_alt')
    unidade_dose_maxima = models.ForeignKey(Unidade, related_name='id_unidade_dose_maxima_alt')

    def __unicode__(self):
        return self.tratamento.patologia.nome

class AprovacaoManager(models.Manager):

    def get_query_set(self):
        qs = super(AprovacaoManager, self).get_query_set()

        return qs

class Aprovacao(Solicitacao):

    class Meta:
        proxy = True

    objects = AprovacaoManager()


    def id_prontuario(self):
        return self.prontuario.identificador

    def nome_patologia(self):
        return self.patologia.nome

    def Nome_antimicrobiano(self):
        return self.antimicrobiano.nome

    def dosagem(self):
        return self.dose

    def periodo_tramamento(self):
        return self.periodo


class Dispensa(Solicitacao):

    class Meta:
        proxy = True

    objects = AprovacaoManager()


    def id_prontuario(self):
        return self.prontuario.identificador

    def nome_patologia(self):
        return self.patologia.nome

    def Nome_antimicrobiano(self):
        return self.antimicrobiano.nome

    def dosagem(self):
        return self.dose

    def periodo_tramamento(self):
        return self.periodo

class SolicitacaoFechada(Solicitacao):
    class Meta:
        proxy = True
        verbose_name_plural = "Solicitações Fechada"


    objects = AprovacaoManager()

    def id_prontuario(self):
        return self.prontuario.identificador

    def nome_patologia(self):
        return self.patologia.nome

    def Nome_antimicrobiano(self):
        return self.antimicrobiano.nome

    def dosagem(self):
        return self.dose

    def periodo_tramamento(self):
        return self.periodo

